package org.erp.spu.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.erp.spu.entity.SpuModel;
import org.erp.spu.entity.SpuModelAttribute;
import org.erp.spu.convert.SpuAttributeConvert;
import org.erp.spu.convert.SpuModelAttributeConvert;
import org.erp.spu.entity.dto.SpuModelAttrChildrenDto;
import org.erp.spu.entity.dto.SpuModelAttrDto;
import org.erp.spu.entity.dto.SpuModelAttributeDto;
import org.erp.spu.entity.vo.SpuModelAttrChildrenVo;
import org.erp.spu.entity.vo.SpuModelAttrParentVo;
import org.erp.spu.entity.vo.SpuModelAttributeVo;
import org.erp.spu.mapper.SpuAttributeMapper;
import org.erp.spu.mapper.SpuModelAttributeMapper;
import org.erp.spu.mapper.SpuModelMapper;
import org.erp.spu.service.SpuModelAttributeService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;

import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;

/**
 * 型号属性关系表(SpuModelAttribute)服务实现类
 *
 * @author dingding
 * @since 2025-11-06 09:13:43
 */
@Service
public class SpuModelAttributeServiceImpl extends ServiceImpl<SpuModelAttributeMapper, SpuModelAttribute> implements SpuModelAttributeService {

    @Resource
    private SpuModelAttributeMapper spuModelAttributeMapper;
    
    @Resource
    private SpuAttributeMapper spuAttributeMapper;
    
    @Resource
    private SpuModelAttributeConvert spuModelAttributeConvert;
    
    @Resource
    private SpuAttributeConvert spuAttributeConvert;

    @Resource
    private SpuModelMapper spuModelMapper;

    
    /**
     * 根据型号id获取属性列表
     * @param modelId 型号ID
     * @return 型号属性列表
     */
    public List<SpuModelAttrParentVo> getListByModelId(Long modelId) {
        return spuModelAttributeMapper.getListByModelId(modelId);
    }
//    @Override
//    public List<SpuModelAttributeVo> getListByModelId(Long modelId) {
//        // 单次查询该型号下的全部关系，逻辑未删除
//        List<SpuModelAttribute> all = spuModelAttributeMapper.selectList(
//                new LambdaQueryWrapper<SpuModelAttribute>()
//                        .eq(SpuModelAttribute::getModelId, modelId)
//                        .eq(SpuModelAttribute::getDelFlag, 0)
//                        .orderByAsc(SpuModelAttribute::getAttributeParentId)
//                        .orderByAsc(SpuModelAttribute::getAttributeId)
//        );
//
//        if (all == null || all.isEmpty()) {
//            return Collections.emptyList();
//        }
//
//        // 父属性：attributeParentId == 0
//        List<SpuModelAttribute> parents = all.stream()
//                .filter(a -> Objects.equals(a.getAttributeParentId(), 0L))
//                .collect(Collectors.toList());
//
//        // 子属性按父属性的 attributeId 分组（与插入逻辑一致）
//        Map<Long, List<SpuModelAttribute>> childrenByParentAttrId = all.stream()
//                .filter(a -> a.getAttributeParentId() != null && !Objects.equals(a.getAttributeParentId(), 0L))
//                .collect(Collectors.groupingBy(
//                        SpuModelAttribute::getAttributeParentId,
//                        LinkedHashMap::new,
//                        Collectors.toList()
//                ));
//
//        List<SpuModelAttributeVo> resultList = new ArrayList<>(parents.size());
//        for (SpuModelAttribute parent : parents) {
//            SpuModelAttributeVo parentVo = spuModelAttributeConvert.convertToVo(parent);
//
//            List<SpuModelAttribute> children = childrenByParentAttrId.getOrDefault(parent.getAttributeId(), Collections.emptyList());
//            List<SpuModelAttrChildrenVo> childrenVos = children.stream().map(child -> {
//                SpuModelAttrChildrenVo vo = new SpuModelAttrChildrenVo();
//                vo.setId(child.getId());
//                vo.setChildrenAttrName(child.getAttributeName());
//                vo.setChildrenId(child.getAttributeId());
//                return vo;
//            }).collect(Collectors.toList());
//
//            parentVo.setChildrens(childrenVos);
//            resultList.add(parentVo);
//        }
//
//        return resultList;
//    }

//    /**
//     * 根据型号id获取属性列表
//     * @param modelId 型号ID
//     * @return 型号属性列表，包含父子结构
//     */
//    @Override
//    public List<SpuModelAttributeVo> getListByModelId(Long modelId) {
//        // 单次查询该型号下的全部子记录
//        List<SpuModelAttribute> all = spuModelAttributeMapper.selectList(
//                new LambdaQueryWrapper<SpuModelAttribute>()
//                        .eq(SpuModelAttribute::getModelId, modelId)
//                        .eq(SpuModelAttribute::getDelFlag, 0)
//                        .orderByAsc(SpuModelAttribute::getAttributeId)
//        );
//        if (all == null || all.isEmpty()) {
//            return Collections.emptyList();
//        }
//        // 仅使用子记录：attributeParentId > 0；按父属性ID分组
//        Map<Long, List<SpuModelAttribute>> childrenByParentAttrId = all.stream()
//                .filter(a -> a.getAttributeParentId() != null && a.getAttributeParentId() > 0)
//                .sorted(Comparator.comparing(SpuModelAttribute::getAttributeParentId)
//                        .thenComparing(SpuModelAttribute::getAttributeId))
//                .collect(Collectors.groupingBy(
//                        SpuModelAttribute::getAttributeParentId,
//                        LinkedHashMap::new,
//                        Collectors.toList()
//                ));
//        if (childrenByParentAttrId.isEmpty()) {
//            return Collections.emptyList();
//        }
//
//        List<SpuModelAttributeVo> resultList = new ArrayList<>(childrenByParentAttrId.size());
//        for (Map.Entry<Long, List<SpuModelAttribute>> entry : childrenByParentAttrId.entrySet()) {
//            Long parentAttrId = entry.getKey();
//            List<SpuModelAttribute> children = entry.getValue();
//            SpuModelAttribute firstChild = children.get(0);
//            // 动态合成父VO（父属性信息来自子记录的 parent 字段）
//            SpuModelAttributeVo parentVo = new SpuModelAttributeVo();
//            parentVo.setModelId(firstChild.getModelId());
//            parentVo.setModelName(firstChild.getModelName());
//            parentVo.setAttributeParentId(0L); // 顶级父集固定为0
//            parentVo.setAttributeParentName(null);
//            parentVo.setAttributeId(parentAttrId); // 父属性ID
//            parentVo.setAttributeName(firstChild.getAttributeParentName()); // 父属性名称
//            List<SpuModelAttrChildrenVo> childrenVos = children.stream().map(child -> {
//                SpuModelAttrChildrenVo vo = new SpuModelAttrChildrenVo();
//                vo.setId(child.getId());
//                vo.setChildrenAttrName(child.getAttributeName());
//                vo.setChildrenId(child.getAttributeId());
//                return vo;
//            }).collect(Collectors.toList());
//            parentVo.setChildrens(childrenVos);
//            resultList.add(parentVo);
//        }
//        return resultList;
//    }
    /**
     * 编辑型号属性关系
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean editSpuModelAttribute(SpuModelAttributeDto spuModelAttributeDto) {
        SpuModel model = spuModelMapper.selectById(spuModelAttributeDto.getModelId());
        Assert.isTrue(model != null, "型号不存在");
        
        // 先删除已有关系（逻辑删除）
        LambdaQueryWrapper<SpuModelAttribute> delWrapper = new LambdaQueryWrapper<>();
        delWrapper.eq(SpuModelAttribute::getModelId, spuModelAttributeDto.getModelId());
        delWrapper.eq(SpuModelAttribute::getDelFlag, 0);
        this.remove(delWrapper);

        // 获取属性列表（允许为空：为空则是纯删除）
        List<SpuModelAttrDto> modelAttrList = spuModelAttributeDto.getModelAttrList();
        if (modelAttrList == null || modelAttrList.isEmpty()) {
            return true;
        }

        // 用于批量插入的列表
        List<SpuModelAttribute> insertList = new ArrayList<>();
        for (SpuModelAttrDto attrDto : modelAttrList) {
        
            // 子属性
            List<SpuModelAttrChildrenDto> childrens = attrDto.getChildrens();
            if (childrens != null && !childrens.isEmpty()) {
                for (SpuModelAttrChildrenDto childrenDto : childrens) {
                    SpuModelAttribute childAttribute = new SpuModelAttribute();
                    childAttribute.setModelId(spuModelAttributeDto.getModelId());
                    childAttribute.setModelName(model.getModelName());
                    childAttribute.setAttributeId(childrenDto.getChildrenId());
                    childAttribute.setAttributeName(childrenDto.getChildrenAttrName());
                    childAttribute.setAttributeParentId(attrDto.getId());
                    childAttribute.setAttributeParentName(attrDto.getAttributeName());
                    insertList.add(childAttribute);
                }
            }
        }

        // 批量插入（若无数据则视为完成）
        return insertList.isEmpty() || this.saveBatch(insertList);
    }


    

}
